package com.chenfan.mcn.controller;

import com.chenfan.mcn.constant.NumberCst;
import com.chenfan.mcn.enums.OperateLockEnum;
import com.chenfan.mcn.enums.RateCardBasicInfoEnum;
import com.chenfan.mcn.enums.RateCardPlatformInfoEnum;
import com.chenfan.mcn.exception.McnErrorCode;
import com.chenfan.mcn.extension.Res;
import com.chenfan.common.extension.validation.groups.Add;
import com.chenfan.common.extension.validation.groups.Modify;
import com.chenfan.common.extension.lock.DistributedLockTemplate;
import com.chenfan.mcn.model.dto.StarRateCardConfigSaveDTO;
import com.chenfan.mcn.model.vo.RateCardConfigCheckbox;
import com.chenfan.mcn.model.vo.StarRateCardConfigVO;
import com.chenfan.mcn.service.StarRateCardConfigService;
import com.chenfan.mcn.utils.BusinessAssert;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;

/**
 * 红人刊例配置
 *
 * @author wulg
 * @since 2021-12-29
 */
@RestController
@RequestMapping("/starRateCard/config")
public class StarRateCardConfigController {

    @Autowired
    private StarRateCardConfigService starRateCardConfigService;


    /**
     * 获取刊例配置复选款信息
     *
     * @return 刊例配置信息
     */
    @GetMapping("/getCheckboxes")
    public Res<RateCardConfigCheckbox> getCheckboxes() {
        RateCardConfigCheckbox rateCardConfigCheckbox = new RateCardConfigCheckbox();
        rateCardConfigCheckbox.setBasicInfo(RateCardBasicInfoEnum.toJsonObject());
        rateCardConfigCheckbox.setPlatformInfo(RateCardPlatformInfoEnum.toJsonObject());
        return Res.ok(rateCardConfigCheckbox);
    }


    /**
     * 新增刊例配置
     *
     * @param dto 入参
     */
    @PostMapping("/add")
    public Res<Boolean> add(@Validated({Add.class}) @RequestBody StarRateCardConfigSaveDTO dto) {
        return Res.ok(DistributedLockTemplate.execute(OperateLockEnum.STAR_RATE_CARD_PLATFORM.generateKey(dto.getPlatformId()),
                () -> starRateCardConfigService.addStarRateCardConfig(dto)));
    }

    /**
     * 编辑刊例配置
     *
     * @param dto 入参
     */
    @PostMapping("/modify")
    public Res<Boolean> modify(@Validated({Modify.class}) @RequestBody StarRateCardConfigSaveDTO dto) {
        return Res.ok(DistributedLockTemplate.execute(OperateLockEnum.STAR_RATE_CARD_CONFIG.generateKey(dto.getId()),
                () -> starRateCardConfigService.modifyStarRateCardConfig(dto)));
    }

    /**
     * 状态-启用/禁用
     *
     * @param id
     * @param enabled true启用 false禁用
     * @return
     */
    @GetMapping("/changeStatus")
    public Res<Boolean> enableStatus(@RequestParam Long id, @RequestParam(defaultValue = "true") boolean enabled) {
        BusinessAssert.notNull(id, McnErrorCode.PARAM_ERROR, "刊例配置ID不能为空");
        return Res.ok(DistributedLockTemplate.execute(OperateLockEnum.STAR_RATE_CARD_CONFIG.generateKey(id),
                () -> starRateCardConfigService.changeStatus(id, enabled ? NumberCst.ONE : NumberCst.ZERO)));
    }

    /**
     * 刊例配置列表
     *
     * @return
     */
    @GetMapping("/list")
    public Res<List<StarRateCardConfigVO>> list() {
        return Res.ok(starRateCardConfigService.getList());
    }

    /**
     * 刊例配置详情
     *
     * @return
     */
    @GetMapping("/detail")
    public Res<StarRateCardConfigVO> detail(@RequestParam Long id) {
        return Res.ok(starRateCardConfigService.detail(id));
    }
}
